home *** CD-ROM | disk | FTP | other *** search
/ Cream of the Crop 22 / Cream of the Crop 22.iso / program / ctlib100.zip / INSTALL.LZH / BTREES3.PAS < prev    next >
Pascal/Delphi Source File  |  1996-10-12  |  5KB  |  194 lines

  1. {**************************************************************************}
  2. {*  BitSoft Development, L.L.C.                                           *}
  3. {*  Copyright (C) 1995, 1996 BitSoft Development, L.L.C.                  *}
  4. {*  All rights reserved.                                                  *}
  5. {*  Containers Library demo                                               *}
  6. {**************************************************************************}
  7.  
  8. program BTrees3;
  9.  
  10. {$X+}
  11.  
  12. { Sample program for creating an object B tree. }
  13.  
  14. uses Objects, Containr, ctBTrees,
  15.      {$ifdef Windows}
  16.      WinCtr;
  17.      {$else}
  18.      Crt;
  19.      {$endif}
  20.  
  21. type
  22.   String20 = string[20];
  23.   String18 = string[18];
  24.   String15 = string[15];
  25.   String25 = string[25];
  26.  
  27. type
  28.   PContact = ^TContact;
  29.   TContact = object (TObject)
  30.       FirstName,
  31.       LastName,
  32.       Phone,
  33.       Company : PString;
  34.     constructor Init(ALastName: String20; AFirstName: String15;
  35.       APhone : String18; ACompany : String25);
  36.     constructor Load(var S: TStream);
  37.     destructor Done; virtual;
  38.     procedure Store(var S: TStream);
  39.   end; { TContact }
  40.  
  41. constructor TContact.Init(ALastName: String20; AFirstName: String15;
  42.   APhone : String18; ACompany : String25);
  43. begin
  44.   FirstName := NewStr(AFirstName);
  45.   LastName := NewStr(ALastName);
  46.   Phone := NewStr(APhone);
  47.   Company := NewStr(ACompany);
  48. end;
  49.  
  50. constructor TContact.Load(var S: TStream);
  51. begin
  52.   FirstName := S.ReadStr;
  53.   LastName := S.ReadStr;
  54.   Phone := S.ReadStr;
  55.   Company := S.ReadStr;
  56. end;
  57.  
  58. destructor TContact.Done;
  59. begin
  60.   DisposeStr(FirstName);
  61.   DisposeStr(LastName);
  62.   DisposeStr(Phone);
  63.   DisposeStr(Company);
  64. end;
  65.  
  66. procedure TContact.Store(var S: TStream);
  67. begin
  68.   S.WriteStr(FirstName);
  69.   S.WriteStr(LastName);
  70.   S.WriteStr(Phone);
  71.   S.WriteStr(Company);
  72. end;
  73.  
  74. const
  75.   RContact : TStreamRec = (
  76.     ObjType: 1000;
  77.     VmtLink: Ofs(TypeOf(TContact)^);
  78.     Load:    @TContact.Load;
  79.     Store:   @TContact.Store);
  80.  
  81. type
  82.   PContactList = ^TContactList;
  83.   TContactList = object(TObjectBTree)
  84.     function KeyOf(Item : Pointer) : Pointer; virtual;
  85.   end; { TContactList }
  86.  
  87. function TContactList.KeyOf(Item : Pointer) : Pointer;
  88. begin
  89.   KeyOf := PContact(Item)^.LastName;
  90. end;
  91.  
  92. procedure DisplayContacts(ContactList : PGraph);
  93.  
  94.   procedure PrintInfo (Item : Pointer); far;
  95.   begin
  96.     with PContact(Item)^ do
  97.       writeln(LastName^, '':15 - Length(LastName^),
  98.         FirstName^, '':15 - Length(FirstName^),
  99.         Phone^, '':20 - Length(Phone^),
  100.         Company^, '':20 - Length(Company^));
  101.   end;
  102.  
  103. begin
  104.   ContactList^.ForEach(@PrintInfo);
  105. end;
  106.  
  107. procedure DisplayFirst(ContactList : PGraph);
  108. var
  109.   Item : Pointer;
  110. begin
  111.   Item := ContactList^.First;
  112.   Writeln('First item:');
  113.   with PContact(Item)^ do
  114.     writeln(LastName^, '':15 - Length(LastName^),
  115.       FirstName^, '':15 - Length(FirstName^),
  116.       Phone^, '':20 - Length(Phone^),
  117.       Company^, '':20 - Length(Company^));
  118.   ContactList^.DoneItem(Item); { not required }
  119. end;
  120.  
  121. procedure DisplayLast(ContactList : PGraph);
  122. var
  123.   Item : Pointer;
  124. begin
  125.   Item := ContactList^.Last;
  126.   Writeln('Last item:');
  127.   with PContact(Item)^ do
  128.     writeln(LastName^, '':15 - Length(LastName^),
  129.       FirstName^, '':15 - Length(FirstName^),
  130.       Phone^, '':20 - Length(Phone^),
  131.       Company^, '':20 - Length(Company^));
  132.   ContactList^.DoneItem(Item); { not required }
  133. end;
  134.  
  135. procedure FindLastName(ContactList : PGraph; LastName : string);
  136. var
  137.   Item : Pointer;
  138. begin
  139.   Item := ContactList^.KeyFirst(@LastName);
  140.   Writeln('Item found with last name ''', LastName, ''':');
  141.   with PContact(Item)^ do
  142.     writeln(LastName^, '':15 - Length(LastName^),
  143.       FirstName^, '':15 - Length(FirstName^),
  144.       Phone^, '':20 - Length(Phone^),
  145.       Company^, '':20 - Length(Company^));
  146.   ContactList^.DoneItem(Item); { not required }
  147. end;
  148.  
  149. var
  150.   ContactList : PContactList;
  151.   Contact : TContact;
  152.   Stream : PBufStream;
  153.  
  154. begin
  155.   ClrScr;
  156.  
  157.   { Create the stream }
  158.   Stream := New(PBufStream, Init('btrees.dat', stCreate, 1024));
  159.  
  160.   { Register the TContact object }
  161.   RegisterType(RContact);
  162.  
  163.   { Create the B tree }
  164.   ContactList := New(PContactList, Init(3, SizeOf(String20) +
  165.     SizeOf(String18) + SizeOf(String15) + SizeOf(String25), Stream, 5));
  166.  
  167.   { Insert the items in the B tree }
  168.   with ContactList^ do
  169.   begin
  170.     Insert(New(PContact, Init('Lewis', 'Carl', '(506) 83-780',
  171.       'Running, Corp.')));
  172.     Insert(New(PContact, Init('Benton', 'Michael', '(403) 33-973',
  173.       'ER, Inc.')));
  174.     Insert(New(PContact, Init('Wagner', 'Robert', '(906) 11-230',
  175.       'Symphony, Ltd.')));
  176.     Insert(New(PContact, Init('Smith', 'John', '(656) 75-843',
  177.       'InterComm, Corp.')));
  178.   end; { with }
  179.  
  180.   DisplayContacts(ContactList);
  181.   Writeln;
  182.   DisplayFirst(ContactList);
  183.   Writeln;
  184.   DisplayLast(ContactList);
  185.   Writeln;
  186.   FindLastName(ContactList, 'Wagner');
  187.  
  188.   { Dispose of the B tree }
  189.   Dispose(ContactList, Done);
  190.  
  191.   { Dispose of the stream }
  192.   Dispose(Stream, Done);
  193. end.
  194.